import numpy as np
import os
import struct

def gen_golden_data_clip():
    # 生成包含正负数的输入数据（范围-2到2）
    input_x = np.random.uniform(-2, 2, [8, 2048]).astype(np.float32)
    
    # 定义裁剪范围 [a, b]
    a = -1.0  # 下限
    b = 1.0   # 上限
    
    # 计算裁剪结果：clip(x, [a, b]) = max(min(x, b), a)
    golden = np.maximum(np.minimum(input_x, b), a).astype(np.float32)
    
    # 创建输入输出目录（确保目录存在）
    os.makedirs("./input", exist_ok=True)
    os.makedirs("./output", exist_ok=True)
    
    # 修正：生成与 ClipCustomTilingData 结构体匹配的 tiling 数据
    # struct ClipCustomTilingData {
    #     uint32_t totalLength;  // 8 * 2048 = 16384
    #     uint32_t tileNum;      // 8
    #     float a;               // -1.0
    #     float b;               // 1.0
    # };
    
    total_length = 8 * 2048  # 16384
    tile_num = 8
    
    # 使用 struct.pack 确保正确的内存布局
    # 'I' = unsigned int (uint32_t), 'f' = float
    tiling_data = struct.pack('IIff', total_length, tile_num, a, b)
    
    # 保存 tiling 数据
    with open("./input/input_tiling.bin", "wb") as f:
        f.write(tiling_data)
    
    # 保存输入和输出数据
    input_x.tofile("./input/input_x.bin")
    golden.tofile("./output/golden.bin")

if __name__ == "__main__":
    gen_golden_data_clip()
